﻿#pragma once
#include <string>
#include <iostream>
#include <sstream>
#include <stdio.h>
#include <assert.h>
using namespace std;

/**********************二维矩阵类**********************
*a、支持不同大小的矩阵，并可以放入不同的数据类型
*b、构造方法：(1)默认构造；(2)方阵构造；(3)一般矩阵构造； (4)复制构造；
*c、运算符重载：(1)加法 + ；(2)减法 - ；(3)矩阵数乘、矩阵相乘 * ；(4)复制赋值 ；(5)输出流运算符 <<
*d、其他方法：(1)获取成员；(2)修改成员；(3)动态内存分配
******************************************************/
template <typename T>
class MyMatrix
{

public:
    // 无参数构造函数
    MyMatrix();

    // 一般构造函数
    MyMatrix(int row, int column);                      //构造m*n的空矩阵
    MyMatrix(stringbuf& buffer, int a, int b);   //把buffer转换成m*n矩阵
    // 复制构造函数
    MyMatrix(const MyMatrix<T>& myMatrix);
    //析构函数
    ~MyMatrix();
    
    //将字符串转化为T类型
    T stringConvertT(const  char* value);

    int getRow() const {return ROW;}
    int getColumn() const {return COLUMN;}

    //运算符重载
    MyMatrix<T> operator=(MyMatrix<T>& m);  //赋值 A=B

    MyMatrix<T> operator+(MyMatrix<T>& m);  //矩阵相加  A+B
    MyMatrix<T> operator+(T num);           //矩阵加数字 每个元素加num
    MyMatrix<T> operator-(MyMatrix<T>& m);  //矩阵相减     A-B
    MyMatrix<T> operator-(T num);           //矩阵减数字  每个元素减num
    MyMatrix<T> operator*(int num);         //数乘 n*A
    MyMatrix<T> operator*(MyMatrix<T>& m);  //矩阵相乘A*B
    MyMatrix<T> operator*=(MyMatrix<T>& m); //矩阵相乘并赋值 A=A*B


    //重载下标运算符,实现 a[m] 返回某一行的值
    T*  operator[](int m) const;

    //提供 a(m, n) 这样的操作  返回m行n列的值
    T  operator()(int m, int n) const;
  

    // 重载运算符‘ << ’
    template<typename T1>
    friend ostream& operator<<(ostream& os, const MyMatrix<T1>& myMatrix);
    

private:
    
    int ROW;
    int COLUMN;

    T * pData;
};